/******************************************************************************
** 公司名称：天津柯迪斯科技有限公司
** 版权信息：
** 文件名称： App_MainTask.c
** 模块名称： KD716主任务模块
** 版 本 号： V1.0
** 作    者： 蒲磊
**
** 修改记录： 版本     修改人      时间         修改内容
**
******************************************************************************/

/******************************************************************************
* 头文件
******************************************************************************/
#include "bsp.h"
#include "App_MainTask.h"
#include "APp_Protocol.h"
#include "App_Parameter.h"
#include "Config.h"
//#include "Bluetooth_User.h"
/******************************************************************************
* 本文件宏定义 ('#define')
******************************************************************************/
#define WDT_Reload()
/******************************************************************************
* 本文件类型定义 ('typedef')
******************************************************************************/

/******************************************************************************
* 函数声明 ('static')
******************************************************************************/
void vAuto_Lamp(void);
/******************************************************************************
* 全局变量定义
******************************************************************************/
uint32_t 	gulAutoPoweroff_Cnt 	= 0;	/*自动关机计数变量*/
uint32_t	gulAutoExitSetting_Cnt 	= 0;	/*自动退出设置计数变量*/
uint8_t		gulIsInSetting			= 0;	/*设置状态标志*/
uint32_t	gulSysVoltage;					/*电源电压值，单位mv*/
uint8_t		gucLamp;
uint8_t		gucLampAuto				= 1;	/*自动大灯标志*/
uint8_t		gucPowerRelease			= 0;	/*Power按键已释放标志*/
int8_t 	    gcPas;
uint8_t     gucVoltage_Calibration  = 0;    /*电压校准标志，上位机发送电压校准指令后，该标志为1，在电压平滑函数中，立即输出当前的电压，同时清零该标志*/
uint8_t     gucEurErrCode           = 0;    /*新欧标错误代码*/
uint8_t		gucTurnLeftLamp;
uint8_t		gucTurnRightLamp;

uint8_t     gucUSBstate;
uint8_t     gucUsb5minFlag = 0;     /*USB 5分钟标志*/

uint8_t     gucUSBin;
uint8_t     gucUSBinCount;
uint8_t     gucUSBoutCount;

/*****************************************************************************
* 函数实现 - global ('extern') and local ('static')
******************************************************************************/


/******************************************************************************
** 功  能：关机函数
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vPowerOff(void)
{
    vParam_Write(&gtRiding,RidingInfo);	    /*保存骑行信息*/
    vPROTOCOL_Set_Lamp(0);                  /*关机前发关灯指令*/
    vPROTOCOL_Set_Pas(0);                   /*关机前发0档*/
    vBsp_DelayMs(600);                      /*延时600ms，确保指令能够发送出去*/
    __disable_irq();
    HAL_TIM_Base_Stop_IT(&htim14);		    /*关TMR1定时器，因为TMR1定时中断中有设置背光的程序，如果不关TMR1，会导致背光又打开*/
    HAL_TIM_Base_Stop_IT(&htim16);          /*关TMR10定时器，关闭通信*/
    vBsp_SetBacklight(0);		            /*关闭背光*/
    HAL_UART_DeInit(&huart1);
    while(1)
    {
        vBsp_LCD_OFF();
        POWER_OFF;
    }
}

/******************************************************************************
** 功  能：秒中断回调函数
** 参  数：无
** 返回值：无
** 备  注：该函数在定时器的中断中被调用。调用周期1S。用于处理和时间相关的事件。
**         比如电压缓降，骑行信息的累加，设置界面超时判定，无操作超时关机等。
******************************************************************************/
void vEvent_1S_Callback(void)
{
    static uint8_t lucStartRiding = 0;
    uint16_t lusSpeed;
    static uint32_t lulLast_Store_ODO = 0;
    WDT_Reload();					/*喂狗*/

    lusSpeed = usPROTOCOL_Get_Speed();

    /*车速大于0，累加骑行信息，并复位自动关机标志*/
    if(lusSpeed > 0)
    {
        if(lusSpeed > gtRiding.Speed_Max)
        {
            gtRiding.Speed_Max = lusSpeed;
        }
        lucStartRiding = 1;															/*开始骑行标记*/
        gtRiding.Total_Time++;														/*总计骑行时间，不可清零*/
        gtRiding.Riding_Time++;														/*小计骑行时间，可以和Trip一起清零*/
        gtRiding.Trip += (lusSpeed * 10 / 36);	/*累加Trip里程，Trip里程的单位是分米*/
        gtRiding.ODO  += (lusSpeed * 10 / 36);	/*累加ODO里程，单位：分米*/
        if(gtRiding.Riding_Time > 0)
        {
            gtRiding.Speed_Avg = gtRiding.Trip * 36UL / gtRiding.Riding_Time / 10UL;	/*计算平均速度，单位：分米/小时*/
            if(gtRiding.Speed_Avg > gtRiding.Speed_Max)
            {
                gtRiding.Speed_Avg = gtRiding.Speed_Max;
            }
        }
        /*里程每增加1Km，保存一次骑行参数*/
        if(gtRiding.ODO > 0 && (gtRiding.ODO > lulLast_Store_ODO + 10000))
        {
            lulLast_Store_ODO = gtRiding.ODO;
            vParam_Write(&gtRiding,RidingInfo);
        }
        else
        {
            if(gtRiding.ODO == 0)
            {
                lulLast_Store_ODO = 0;
            }
        }

        /*复位自动关机计数*/
        gulAutoPoweroff_Cnt = 0;
    }
    else
    {
        /*每次骑行，速度为0时，保存一下骑行信息*/
        if(lucStartRiding == 1)
        {
            vParam_Write(&gtRiding,RidingInfo);
        }
        lucStartRiding = 0;
        /*车速等于0，判断当前是否处于设置菜单，如果不处于设置状态，自动关机计数累加，超时后自动关机*/
        if(gulIsInSetting == 0 && gtParam.Idle_Time > 0)
        {
            if(++gulAutoPoweroff_Cnt > gtParam.Idle_Time * 6UL)
            {
                gulAutoPoweroff_Cnt = 0;
                if (gucUSBstate == 1)
                {
                    gucUsb5minFlag = 1;
                }
                else
                {
                    vPowerOff();
                }
            }
        }
        else
        {
            gulAutoPoweroff_Cnt = 0;
        }
    }

    /*电源电压平滑处理*/
    gulSysVoltage = ulVoltage_Smoothing(ADC_Get_ADC_Channel_Value(ADC_VOLTAGE_CHANNEL),gulVolt_Ref);

    /*自动大灯处理*/
    vAuto_Lamp();
}


/******************************************************************************
** 功  能：进入设置前的操作
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vEnter_Setting(void)
{
    vPROTOCOL_Set_Pas(0);								/*在设置界面，档位发0档*/
    vPROTOCOL_Send_Config_Data();						/*发送配置帧*/
    gulIsInSetting = 1;
    vResetAutoExitSettingCnt();							/*复位一下超时计数*/

}


/******************************************************************************
** 功  能：退出设置并保存设置
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vExit_Setting_With_Saving(void)
{
    vParam_Write(&gtParam,ConfigInfo);		    /*保存参数*/
    vPROTOCOL_Set_Pas_Range(gtParam.Pas_Max);   /*重新设置档位范围*/
    if(gcPas > gtParam.Pas_Max)
    {
        gcPas = gtParam.Pas_Max;               /*重新设置档位后，如果当前档位大于最大档位，则更改为最大档位*/
    }
    if(gcPas < gtParam.Pas_Min)
    {
        gcPas = gtParam.Pas_Min;
    }
    vPROTOCOL_Set_Pas(gcPas);
    vPROTOCOL_Set_Value_When_ExitSetting();
    vBsp_SetBacklight(gucLamp == 0 ? ucGet_Backlight_Precent(gtParam.Backlight):ucGet_Backlight_Precent(0));

    gulIsInSetting = 0;
}

/******************************************************************************
** 功  能：退出设置不保存设置
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vExit_Setting_Without_Saving(void)
{
    vParam_Read(&gtParam,ConfigInfo);		/*重新读取参数*/
    vPROTOCOL_Set_Pas(gcPas);
    vPROTOCOL_Set_Value_When_ExitSetting();
    vBsp_SetBacklight(gucLamp == 0 ? ucGet_Backlight_Precent(gtParam.Backlight):ucGet_Backlight_Precent(0));

    gulIsInSetting = 0;
}


/******************************************************************************
** 功  能：恢复出厂设置
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vFactory_Restore(void)
{
    vParam_ResetConfig(&gtParam);	/*重置所有参数为默认设置*/
#if USE_BLUETOOTH == 1
    bt_uart_write_frame(5U,0);      /*解绑蓝牙模组*/
#endif
    gulIsInSetting = 0;
    gucLamp = 0;
    gucLampAuto = 1;
    gcPas = gtParam.Pas_Def;
    vPROTOCOL_Set_Lamp(gucLamp);
    vPROTOCOL_Set_Pas_Range(gtParam.Pas_Max);
    vPROTOCOL_Set_Pas(0);/*此处发0档，当恢复出厂设置后，会假性重启，显示LOGO，显示完LOGO，进入主界面时，会自动切换为发送默认档位*/
    vPROTOCOL_Set_Value_When_ExitSetting();
    vBsp_SetBacklight(ucGet_Backlight_Precent(gtParam.Backlight));
}


/******************************************************************************
** 功  能：复位自动退出设置计数变量
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vResetAutoExitSettingCnt(void)
{
    __disable_irq();
    gulAutoExitSetting_Cnt = 0;
    __enable_irq();
}

/******************************************************************************
** 功  能：复位自动关机计数变量
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vResetAutoPowerOffCnt(void)
{
    __disable_irq();
    gulAutoPoweroff_Cnt = 0;
    __enable_irq();
}


/******************************************************************************
** 功  能：电压平滑函数
** 参  数：ADCValue-当前电压采样值，Voltage_Ref-电压校准值（标准36V时的采样值）
** 返回值：经过平滑处理以后的系统电压值（mv）
** 备  注：1秒钟调用一次
******************************************************************************/
uint32_t ulVoltage_Smoothing(uint32_t ADCValue,uint32_t Voltage_Ref)
{
    static uint32_t lulLast_Voltage	   = 0;
    static uint32_t lulCurrent_Voltage = 0;

    lulCurrent_Voltage = ADCValue * CONFIG_DEF_VOL * 1000 / Voltage_Ref;/*根据校准时的采样值，等比例计算当前的电压*/

    /*当接收到上位机发送的电压校准指令后，立即输出校准后的电压，同时清零电压校准标志*/
    if(gucVoltage_Calibration == 1)
    {
        gucVoltage_Calibration = 0;
        lulLast_Voltage = lulCurrent_Voltage;
    }
    else
    {
        if(lulCurrent_Voltage > lulLast_Voltage)
        {
            if(lulLast_Voltage == 0)
            {
                lulLast_Voltage = lulCurrent_Voltage;
            }
            /*如果当前电压大于上次电压，返回上次电压值，即不允许电压回升*/
            return lulLast_Voltage;
        }
        else
        {
            /*如果当前电压和上次电压的差值超过了缓降率，则按照最大缓降率下降，否则按照实际值下降*/
            if(lulLast_Voltage - lulCurrent_Voltage > VOLTAGE_SMOOTHING_RATE)
            {
                lulLast_Voltage -= 10;//VOLTAGE_SMOOTHING_RATE;
            }
            else
            {
                //lulLast_Voltage = lulCurrent_Voltage;
            }
        }
    }

    return lulLast_Voltage;
}

/******************************************************************************
** 功  能：获取系统电源电压（mv）
** 参  数：无
** 返回值：当前以毫伏表示的电源电压
** 备  注：
******************************************************************************/
uint32_t ulGet_Sys_Voltage(void)
{
    return gulSysVoltage;
}

/******************************************************************************
** 功  能：参数初始化
** 参  数：无
** 返回值：无
** 备  注：进入主界面之前，必要的参数及变量的初始化
******************************************************************************/
void vInit_Parameter(void)
{
    uint8_t  Ver;
    uint32_t  lucResetFlag;

    lucResetFlag = *((uint32_t *)(RESET_FLAG_ADDRESS));      /*读取Flash中的恢复出厂参数标志位*/
    EE_ReadBytes(&Ver,100,1);								/*读取参数版本号，用于判断是否需要更新参数(KD716 G030版本的一次程序，标识参数更新的AA标志所在EEPROM的地址为100)*/
    if((Ver != CURRENT_VER))// || (lucResetFlag == 0xFFFFFFFF))
    {
        Ver = CURRENT_VER;
        EE_WriteBytes(&Ver,100,1);                                /*写入版本号标志*/
        vParam_ResetConfig(&gtParam);							/*填充默认参数，并写入EEPROM*/
        vParam_ResetRiding_With_ODO(&gtRiding);					/*骑行信息清零*/
//		gulVolt_Ref = VOLTAGE_REFERENCE;
//		vParam_Write(&gulVolt_Ref,VoltRef);						/*默认36V电压基准采样值。*/
//		gusPhotoDiode_ADC_Value = DEFAULT_PHOTODIODE_ADC;
//		vParam_Write(&gusPhotoDiode_ADC_Value,PhotoDiode);		/*填充并保存默认的光感阀值*/
#if USE_BLUETOOTH
        bt_uart_write_frame(5U,0);                              /*第一次上电重置模组*/
#endif
        //vParam_ErasureResetFlag();
    }

    vParam_Read(&gtParam,ConfigInfo);					/*读取设置参数*/
    vBsp_DelayMs(25);
    vParam_Read(&gtRiding,RidingInfo);					/*读取骑行信息*/
    vBsp_DelayMs(25);
    vParam_Read(&gulVolt_Ref,VoltRef);					/*读取电压基准值*/
    if(gulVolt_Ref == 0 || gulVolt_Ref == 0xFFFFFFFF)
    {
        gulVolt_Ref = VOLTAGE_REFERENCE;
        vParam_Write(&gulVolt_Ref,VoltRef);						/*默认36V电压基准采样值。*/
    }
    vParam_Read(&gusPhotoDiode_ADC_Value,PhotoDiode);	/*读取光感校准值*/
    if(gusPhotoDiode_ADC_Value == 0 || gusPhotoDiode_ADC_Value == 0xFFFF)
    {
        gusPhotoDiode_ADC_Value = DEFAULT_PHOTODIODE_ADC;
        vParam_Write(&gusPhotoDiode_ADC_Value,PhotoDiode);		/*填充并保存默认的光感阀值*/
    }
    gcPas = gtParam.Pas_Def;
    if(gcPas < gtParam.Pas_Min)
    {
        gcPas = gtParam.Pas_Min;
    }
    gulSysVoltage = ulVoltage_Smoothing(ADC_Get_ADC_Channel_Value(ADC_VOLTAGE_CHANNEL),gulVolt_Ref);	/*获取一次系统电压*/
#if EUR_STD == 1/*新欧标的超压检测*/
    if(gulSysVoltage > EUR_OVER_VOLT * 100)
    {
        vSet_Eur_Standard_ErrCode(0x34);
    }
#endif

}


/******************************************************************************
** 功  能：校准电压功能
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
uint16_t vVoltage_Calibration(void)
{
    gulVolt_Ref = ADC_Get_ADC_Channel_Value(ADC_VOLTAGE_CHANNEL);
    vParam_Write(&gulVolt_Ref,VoltRef);
    gucVoltage_Calibration = 1;     /*置位电压校准标志，在电压缓降函数中，立即输出当前电压*/

    return gulVolt_Ref;
}

/******************************************************************************
** 功  能：清ODO
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vClear_ODO(void)
{
    vParam_ResetRiding_With_ODO(&gtRiding);

}



/******************************************************************************
** 功  能：光感校准
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
uint16_t vPhotoDiode_Calibration(void)
{
    char Text[30];
    uint16_t	lusPhotoDiodeValue = ADC_Get_ADC_Channel_Value(ADC_LIGHT_CHAANEL);
    if(lusPhotoDiodeValue < 3000)
    {
        sprintf(Text,"%s","Cover The Sensor!");
    }
    else
    {
        sprintf(Text,"%s\r\n%d","AL Calibration...",lusPhotoDiodeValue);
        gusPhotoDiode_ADC_Value = lusPhotoDiodeValue;
        vParam_Write(&gusPhotoDiode_ADC_Value,PhotoDiode);
    }

    return lusPhotoDiodeValue;
}

/******************************************************************************
** 功  能：时间日期校准
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vDateTime_Calibration(uint8_t Year,uint8_t Month,uint8_t Day,uint8_t Hour,uint8_t Min,uint8_t Sec)
{
    /*上位机软件不支持设置日期，应此自动校准时间暂不开放*/
//				lxCalendar.year	= 2022;
//				lxCalendar.month = 1;
//				lxCalendar.date = 1;
//				lxCalendar.hour = gucRx_Buffer[4];
//				lxCalendar.min  = gucRx_Buffer[5];
//				lxCalendar.sec  = gucRx_Buffer[6];
//				ucRTC_Time_Set(&lxCalendar);
}

/******************************************************************************
** 功  能：自动大灯处理
** 参  数：无
** 返回值：无
** 备  注：
******************************************************************************/
void vAuto_Lamp(void)
{
    uint16_t lusPhotoValue = ADC_Get_ADC_Channel_Value(ADC_LIGHT_CHAANEL);
    static uint8_t lucCnt = 0;
    if(gucLampAuto == 1 && gtParam.AL_Sensitivity > 0)
    {
        if(lusPhotoValue > gusPhotoDiode_ADC_Value - 20 * gtParam.AL_Sensitivity && gucLamp == 0)
        {
            /*三次采样处于阀值以下，打开大灯*/
            if(++lucCnt > 1)
            {
                gucLamp = 1;
            }
        }

        if(lusPhotoValue < gusPhotoDiode_ADC_Value - 20 * gtParam.AL_Sensitivity - 20 && gucLamp == 1)
        {
            if(--lucCnt < 1)
            {
                gucLamp = 0;
            }
        }
        if(gulIsInSetting == 0)
        {
            vBsp_SetBacklight(gucLamp == 0 ? ucGet_Backlight_Precent(gtParam.Backlight):ucGet_Backlight_Precent(0));
            vPROTOCOL_Set_Lamp(gucLamp);
        }
    }
}


/******************************************************************************
** 功  能：手动更改大灯状态
** 参  数：无
** 返回值：无
** 备  注：手动打开大灯后，自动大灯会失效，手动关闭大灯后，自动功能恢复
******************************************************************************/
void vToggle_Lamp_Manual(void)
{

    gucLamp = gucLamp == 0 ? 1:0;
    gucLampAuto = 0;                        /*开机后，只要手动更改过大灯状态，自动大灯功能失效*/
    //gucLampAuto = gucLamp == 0 ? 1:0;		/*手动关闭大灯后，自动大灯功能恢复*/
    vBsp_SetBacklight(gucLamp == 0 ? ucGet_Backlight_Precent(gtParam.Backlight):ucGet_Backlight_Precent(0));
    vPROTOCOL_Set_Lamp(gucLamp);

}


/******************************************************************************
** 功  能：标记Power按键已经释放
** 参  数：无
** 返回值：无
** 备  注：该函数用于标记Power键在开机后已经释放过。防止长按Power键开机后再关机
******************************************************************************/
void vPowerButton_Released(void)
{
    gucPowerRelease = 1;
}


/******************************************************************************
** 功  能：根据当前电压和电压分段，计算电量百分比
** 参  数：Volt-当前电压（mV）
** 返回值：电量百分比，0-100%
** 备  注：该函数是根据当前电压值和电压分段值进行比较，确定当前的百分比。
******************************************************************************/
uint8_t ucGet_Battery_Soc(uint32_t Volt)
{
    uint16_t * lpBattery_Level;
    uint8_t n;
    uint16_t lusSoc;

    switch(gtParam.Volt)
    {
    case 36:
    {
        lpBattery_Level = &gtParam.V_36_Tab[0];
        break;
    }
    case 48:
    {
        lpBattery_Level = &gtParam.V_48_Tab[0];
        break;
    }
    case 52:
    {
        lpBattery_Level = &gtParam.V_52_Tab[0];
        break;
    }
    }
    /*查找当前电压位于那一个电压分段中*/
    for(n = 0; n < CONFIG_BAT_LEVEL_NUM; n++)
    {
        if(Volt < lpBattery_Level[n])
        {
            break;
        }
    }

    if(n == CONFIG_BAT_LEVEL_NUM)/*电压值大于电压分段的最高值，此时SOC>80%*/
    {
        /*根据60%-80%段的比例，计算当前段电压和SOC的关系*/
        lusSoc = gtParam.V_BMS_Tab[n - 1] + (Volt - lpBattery_Level[n - 1]) * (gtParam.V_BMS_Tab[n - 1] - gtParam.V_BMS_Tab[n - 2]) / (lpBattery_Level[n - 1] - lpBattery_Level[n - 2]);
    }
    else if(n == 0)/*电压值小于电压分段的最小值，此时SOC<5%*/
    {
        /*此时根据5%-10%的比例关系估算电压和SOC的关系*/
        lusSoc = (lpBattery_Level[0] - Volt) * (gtParam.V_BMS_Tab[1] - gtParam.V_BMS_Tab[0]) / (lpBattery_Level[1] - lpBattery_Level[0]);
        if(lusSoc > 5)
        {
            lusSoc = 5;
        }
        lusSoc = gtParam.V_BMS_Tab[0] - lusSoc;
    }
    else
    {
        lusSoc = gtParam.V_BMS_Tab[n - 1] + (Volt - lpBattery_Level[n - 1]) * (gtParam.V_BMS_Tab[n] - gtParam.V_BMS_Tab[n - 1]) / (lpBattery_Level[n] - lpBattery_Level[n -1]);
    }
    /*防止计算出来的数超量程*/
    if(lusSoc > 100)
    {
        lusSoc = 100;
    }
    return lusSoc;

}

/******************************************************************************
** 功  能：根据轮径索引值获取轮径数值
** 参  数：无
** 返回值：轮径数值
** 备  注：
******************************************************************************/
uint16_t usGet_Wheel_Size(uint8_t WheelIndex)
{
    static uint16_t WheelSizeTab[] = CONFIG_WHEEL_SIZE_TAB;

    uint8_t lucTab_Length = sizeof(WheelSizeTab) / sizeof(WheelSizeTab[0]) - 1;

    if(WheelIndex > lucTab_Length)
    {
        WheelIndex =lucTab_Length;
    }
    /*当轮径为要求显示27.5Inch或者700C时，计算按照27.5计算，否则按照27计算*/
    if(WheelSizeTab[WheelIndex] == 270 && (CONFIG_27INCH_DISPLAY == DISPLAY_275 || CONFIG_27INCH_DISPLAY == DISPLAY_700C))
    {
        return 275;
    }
    else
    {
        return WheelSizeTab[WheelIndex];
    }
}


/******************************************************************************
** 功  能：根据背光等级，获取对应的百分比亮度
** 参  数：无
** 返回值：背光百分比数值
** 备  注：
******************************************************************************/
uint8_t ucGet_Backlight_Precent(uint8_t Backlight_Level)
{
    const uint8_t lucPrecentTab[] = {3,5,10,15,25,40};   /*5级背光*/
    if(Backlight_Level > 5)
    {
        Backlight_Level = 5;
    }
    return lucPrecentTab[Backlight_Level];
}

/******************************************************************************
** 功  能：返回新欧标错误代码
** 参  数：无
** 返回值：新欧标检测错误代码。0x31-MOS短路，0x32-Power键粘滞，0x33-减键粘滞，0x34-超压
** 备  注：无
******************************************************************************/
uint8_t ucGet_Eur_Standard_ErrCode(void)
{
    return gucEurErrCode;
}


/******************************************************************************
** 功  能：设置新欧标错误代码
** 参  数：ErrCode-新欧标检测错误代码。0x31-MOS短路，0x32-Power键粘滞，0x33-减键粘滞，0x34-超压
** 返回值：无
** 备  注：无
******************************************************************************/
void vSet_Eur_Standard_ErrCode(uint8_t ErrCode)
{
    gucEurErrCode = ErrCode;
}

/******************************************************************************
** 功  能：判断是否在设置界面
** 参  数：无
** 返回值：0-不在设置界面，1-在设置界面
** 备  注：无
******************************************************************************/
uint8_t ucGet_Is_InSetting(void)
{
    return gulIsInSetting;
}

/******************************************************************************
** 功  能：USB滤波
** 参  数：无
** 返回值：USB是否充电，1-充电
** 备  注：
**
******************************************************************************/
void vUSB_state(void)
{

    gucUSBin = (USB_CHARGE_PIN?0:1);   /*gucUSBin==1时是在充电*/

    if(gucUSBstate)
    {
        if(gucUSBin == 0)
        {
            gucUSBoutCount++;
        }
        else
        {
            gucUSBoutCount = 0;
        }
        if(gucUsb5minFlag)
        {
            if(gucUSBoutCount > 125)
            {
                gucUSBstate = 0;
                //gucUsb5minFlag = 0;
                //vPowerOff();//拔掉后关机
            }

        }
        else
        {
            if(gucUSBoutCount > 30)
            {
                gucUSBoutCount = 0;
                gucUSBstate = 0;
            }
        }
    }
    else
    {
        if(gucUSBin)
        {
            gucUSBinCount++;
        }
        else
        {
            gucUSBinCount = 0;
        }
        if(gucUSBinCount > 3)
        {
            gucUSBinCount = 0;
            gucUSBstate = 1;
        }
    }
}
